package klk.shop.z.kev.artikel;

import klk.shop.z.kev.tools.KDate;


public class Article implements Comparable<Article> {

    // statische Felder ---------------------------------------------------------------------------
    public static   KDate 	f2 		= 	KDate.schwarz,
                          	f1 		= 	KDate.mischen( f2, KDate.schwarz ).mischen( KDate.schwarz );
    public static  String 	table 	= 	getTableTag(f1, f2),											    
							th 		= 	getThTag(f1, 1),
						    th3 	= 	getThTag(f1, 3),
						    td 		= 	getTdTag(f2, 1),
						    td3 	= 	getTdTag(f2, 3);
    public static   long  artikelNr =	9900000000L;
    // statische Methoden -------------------------------------------------------------------------
    public static String dString(double d) { return String.format( "%6.2f", d ); }
    public static String getThTag(KDate farbe, int colSpan) {
    	return "<th colspan=" + colSpan + " style='color:white;border:1px solid black;text-align:left;background-color:" + farbe + ";'>";
    }
    public static String getTdTag(KDate farbe, int colSpan) {
    	return "<td colspan=" + colSpan + " style='border:1px solid black;background-color:" + farbe + ";'>";
    }    
    public static String getTableTag(KDate f1, KDate f2) {
    	return 	"<table style='border:1px solid gray;font-family:monospace;" +
				    "th{" +
				        "text-align:left;" +
				        "border:1px solid white;" +
				        "color:white;" +
				        "background-color:"+ f1 +";" +
					"}" +
					"td{" +
				        "background-color:"+ f2 +";" +
				        "border:1px solid black;" +
					"}'>";
    }   
    // --------------------------------------------------------------------------------------------


    // Felder -------------------------------------------------------------------------------------
    protected     long 	artikelnummer;
    protected   String 	bezeichnung;
    protected   double 	nettoVerkaufsPreis, uSteuer;
    protected      int 	anzahl;
    // ---
    protected   double 	einstandsPreis, handelsKostenZuschlag, gewinnZuschlag, kundenSkonto, kundenRabatt;
    // getter für eigene Felder -------------------------------------------------------------------
    public   long getArtikelnummer() 	{ return artikelnummer; 		}
    public String getBezeichnung() 		{ return bezeichnung;   		}
    public double getNettopreis() 		{ return nettoVerkaufsPreis; 	}
    public double getUSteuer() 			{ return uSteuer;				}
    public    int getAnzahl() 			{ return anzahl; 				}
    // ---
    public double getEinstandsPreis() 			{ return einstandsPreis;		}
    public double getHandelsKostenZuschlag()	{ return handelsKostenZuschlag;	}
    public double getGewinnZuschlag() 			{ return gewinnZuschlag;		}
    public double getKundenSkonto() 			{ return kundenSkonto;			}
    public double getKundenRabatt() 			{ return kundenRabatt;			}
    // spezielle getter ---------------------------------------------------------------------------
    public double getBruttopreis()  			{ return nettoVerkaufsPreis 	+ getSteuerBetrag();            }
    public double getSteuerBetrag() 			{ return nettoVerkaufsPreis 	* uSteuer / 100;	 			}
    // ---
    public double getSelbstKostenPreis() 		{ return einstandsPreis         * (1+handelsKostenZuschlag); 	}
    public double getBarVerkaufsPreis() 		{ return getSelbstKostenPreis() * (1+gewinnZuschlag); 			}
    public double getZielVerkaufsPreis() 		{ return getBarVerkaufsPreis() 	* (1+kundenRabatt); 			}
    public double getNettoVerkaufsPreis() 		{ return getZielVerkaufsPreis()	* (1+kundenSkonto);  			}	//return getZielVerkaufsPreis()	* (1+kundenSkonto);
    public double getKalkulationsZuschlag()     { return nettoVerkaufsPreis 	- einstandsPreis; 				}
    public double getHandelsSpanne() 			{ return 0; }
    // setter für eigene Felder -------------------------------------------------------------------
    public   void setArtikelnummer(long artikelnummer)	{ this.artikelnummer 		= artikelnummer; 	}
    public   void setBezeichnung(String bezeichnung) 	{ this.bezeichnung   		= bezeichnung; 		}
    public   void setNettopreis(double nettopreis) 		{ this.nettoVerkaufsPreis 	= nettopreis;       }
    public   void setUSteuer(double uSteuer) 			{
        if (uSteuer<1 && uSteuer>0)
            uSteuer *= 100;
        this.uSteuer = uSteuer;
    }
    public   void setAnzahl(int anzahl) 				{ this.anzahl        		= anzahl; 			}
    // ---
    public final void setEinstandsPreis			(double einstandsPreis) 		{ this.einstandsPreis 			= einstandsPreis; 			}
    public final void setHandelsKostenZuschlag	(double handelsKostenZuschlag) 	{ this.handelsKostenZuschlag 	= handelsKostenZuschlag;	}
    public final void setGewinnZuschlag			(double gewinnZuschlag) 		{ this.gewinnZuschlag 			= gewinnZuschlag; 			}
    public final void setKundenSkonto			(double kundenSkonto) 			{ this.kundenSkonto 			= kundenSkonto; 			}
    public final void setKundenRabatt			(double kundenRabatt) 			{ this.kundenRabatt 			= kundenRabatt; 			}
    // spezielle setter ---------------------------------------------------------------------------
    public final void setNettoPreisByEinstandsPreis(double einstandsPreis) 		{
        double 		selbstKostenPreis 		= einstandsPreis 		* (1+handelsKostenZuschlag),
                    barVerkaufsPreis		= selbstKostenPreis 	* (1+gewinnZuschlag),
                    zielVerkaufsPreis 		= barVerkaufsPreis 		* (1+kundenRabatt);
        this.nettoVerkaufsPreis 			= zielVerkaufsPreis		* (1+kundenSkonto);
    }
    public final void setEinstandsPreisByNettoPreis(double nettoVerkaufsPreis) 	{
        double		zielVerkaufsPreis		= nettoVerkaufsPreis 	/ (1+kundenSkonto),
                    barVerkaufsPreis		= zielVerkaufsPreis 	/ (1+kundenRabatt),
                    selbstKostenPreis		= barVerkaufsPreis 		/ (1+gewinnZuschlag);
        this.einstandsPreis 				= selbstKostenPreis 	/ (1+handelsKostenZuschlag);
    }
    public final void setEinstandsPreisByBruttoPreis(double bruttoVerkaufsPreis) {
    	this.nettoVerkaufsPreis = bruttoVerkaufsPreis/1.19;
    	setEinstandsPreisByNettoPreis(nettoVerkaufsPreis);
    }
    // --------------------------------------------------------------------------------------------


    // Klassenspezifishes -------------------------------------------------------------------------
    @Override
	public String toString() {
        return String.format( 	"%-50s %6.2f  %6.0f%%  %6d\n",
                                artikelnummer + " " + bezeichnung,
                                nettoVerkaufsPreis,
                                uSteuer,
                                anzahl 							 			);
    }
    public String toAuflistung() {
        return String.format(	"%50s %s		\n" +
                                "%50s %s		\n" +
                                "%50s %6s		\n" +
                                "%50s %5.0f%%	\n" +
                                "%50s %6s		\n" +
                                "%50s %s		\n" +
                                "%50s %s		  ",
                                    "Artikelnummer:",	artikelnummer,
                                    "Bezeichnung:", 	bezeichnung,
                                    "Nettopreis:", 	dString( nettoVerkaufsPreis ),
                                    "Steuer:", 		uSteuer,
                                    "Bruttopreis:", 	dString( getBruttopreis() ),
                                    "Lagerbestand:", 	anzahl					);
    }
    public String toHtml() { return "<html>" + table + toTeilHtml() + "</table></html>"; }
    public String toTeilHtml() {
        //return 	"<tr>" +
        return "" + 
                        td + bezeichnung + 							"</td>" +
                        td + dString( nettoVerkaufsPreis ) +		"</td>" +
                        td + String.format( "%5.0f%%", uSteuer ) + 	"</td>" +
                        td + anzahl + 								"</td>" //+
                   ;// "</tr>";
    }
    public String toHtmlAuflistung() { return "<html>" + table +  toTeilHtmlAuflistung() + "</table></html>"; }
    public String toTeilHtmlAuflistung() {
            return String.format(	"<tr>" + th + "%s	</th>" + td + "%d		</td></tr>" +
                                    "<tr>" + th + "%s	</th>" + td + "%s		</td></tr>" +
                                    "<tr>" + th + "%s	</th>" + td + "%d		</td></tr>" +
                                    
                                    "<tr>" + th + "%s	</th>" + td + "%s		</td></tr>" +
                                    "<tr>" + th + "%s	</th>" + td + "%s		</td></tr>" +
                                    "<tr>" + th + "%s	</th>" + td + "%s		</td></tr>" +
                                    "<tr>" + th + "%s	</th>" + td + "%s		</td></tr>" +
                                    "<tr>" + th + "%s	</th>" + td + "%s		</td></tr>" +
                                    "<tr>" + th + "%s	</th>" + td + "%5.0f%%	</td></tr>" +
                                    "<tr>" + th + "%s	</th>" + td + "%s		</td></tr>",
                                        "Artikelnummer:", 	artikelnummer,
                                        "Bezeichnung:", 	bezeichnung,
                                        "Lagerbestand:",	anzahl,
                                        
                                        "Einstandspreis:", 		dString( getEinstandsPreis() ),
                                        "Selbstkostenpreis:", 	dString( getSelbstKostenPreis() ) + " (bei Faktor " + dString( handelsKostenZuschlag ) + " (Handelskostenzuschlag))",
                                        "Barverkaufspreis:", 	dString( getBarVerkaufsPreis() ) + " (bei Faktor " + dString( gewinnZuschlag ) + " (Gewinnzuschlag))",
                                        "Zielverkaufspreis:",	dString( getZielVerkaufsPreis() ) + " (bei Faktor " + dString( kundenRabatt ) + " (Kundenrabatt))",
                                        "Nettopreis:", 			dString( nettoVerkaufsPreis ) + " (bei Faktor " + dString( kundenSkonto ) + " (Kundenskonto))",
                                        "Steuer:", 				uSteuer,
                                        "Bruttopreis:", 		dString( getBruttopreis() )				         );
    }
    @Override
    public Article clone() { return clone(0); }
    public Article clone(int anzahl) {
        return new Article(	artikelnummer, bezeichnung, nettoVerkaufsPreis, uSteuer, anzahl	);
    }
    @Override
    public int compareTo(Article a) { return (int)( getArtikelnummer() - a.getArtikelnummer() ); }
    // --------------------------------------------------------------------------------------------


    // Konstruktoren ------------------------------------------------------------------------------
    public Article() {
        this( ++artikelNr, "Artikel", 0, 19, 0 );
    }
    public Article(String bezeichnung, double nettopreis, double uSteuer, int anzahl) {
        this( ++artikelNr, bezeichnung, nettopreis, uSteuer, anzahl );
    }
    public Article(long artikelnummer, String bezeichnung, double nettoVerkaufsPreis, double uSteuer, int anzahl ) {
        this.artikelnummer 		= artikelnummer;
        this.bezeichnung 		= bezeichnung;
        this.nettoVerkaufsPreis = nettoVerkaufsPreis;
        this.uSteuer 			= uSteuer;
        this.anzahl 			= anzahl;

        handelsKostenZuschlag 	= 0.3;
        gewinnZuschlag 			= 0.05;
        kundenSkonto 			= 0.03;
        kundenRabatt 			= 0.05;
        setEinstandsPreisByNettoPreis(nettoVerkaufsPreis);
    }
    // --------------------------------------------------------------------------------------------

}
